home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / postgres / postgre4.z / postgre4 / src / lib / C / oset.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  3.4 KB  |  210 lines

  1. /*
  2.  * oset.c --
  3.  *    Fixed format ordered set definitions.
  4.  *
  5.  * Note:
  6.  *    XXX This is a preliminary implementation which lacks fail-fast
  7.  *    XXX validity checking of arguments.
  8.  */
  9.  
  10. #include "tmp/c.h"
  11.  
  12. RcsId("$Header: /private/postgres/src/lib/C/RCS/oset.c,v 1.4 1990/09/25 16:22:57 kemnitz Exp $");
  13.  
  14. #include "utils/memutils.h"
  15.  
  16. /*
  17.  * OrderedElemGetBase --
  18.  *    Returns base of enclosing structure.
  19.  */
  20.  
  21. Pointer
  22. OrderedElemGetBase(elem)
  23.     OrderedElem    elem;
  24. {
  25.     if (elem == (OrderedElem) NULL)
  26.         return (Pointer) NULL;
  27.  
  28.     return ((Pointer)((char*)(elem) - (elem)->set->offset));
  29. }
  30.  
  31. void
  32. OrderedSetInit(set, offset)
  33.     OrderedSet    set;
  34.     Offset        offset;
  35. {
  36.     set->head = (OrderedElem)&set->dummy;
  37.     set->dummy = NULL;
  38.     set->tail = (OrderedElem)&set->head;
  39.     set->offset = offset;
  40. }
  41.  
  42. void
  43. OrderedElemInit(elem, set)
  44.     OrderedElem    elem;
  45.     OrderedSet    set;
  46. {
  47.     elem->set = set;
  48.     /* mark as unattached */
  49.     elem->next = NULL;
  50.     elem->prev = NULL;
  51. }
  52.  
  53. bool
  54. OrderedSetContains(set, elem)
  55.     OrderedSet    set;
  56.     OrderedElem    elem;
  57. {
  58.     return ((bool)(elem->set == set && (elem->next || elem->prev)));
  59. }
  60.  
  61. Pointer
  62. OrderedSetGetHead(set)
  63.     register OrderedSet    set;
  64. {
  65.     register OrderedElem    elem;
  66.  
  67.     elem = set->head;
  68.     if (elem->next) {
  69.         return (OrderedElemGetBase(elem));
  70.     }
  71.     return (NULL);
  72. }
  73.  
  74. Pointer
  75. OrderedSetGetTail(set)
  76.     register OrderedSet    set;
  77. {
  78.     register OrderedElem    elem;
  79.  
  80.     elem = set->tail;
  81.     if (elem->prev) {
  82.         return (OrderedElemGetBase(elem));
  83.     }
  84.     return (NULL);
  85. }
  86.  
  87. Pointer
  88. OrderedElemGetPredecessor(elem)
  89.     register OrderedElem    elem;
  90. {
  91.     elem = elem->prev;
  92.     if (elem->prev) {
  93.         return (OrderedElemGetBase(elem));
  94.     }
  95.     return (NULL);
  96. }
  97.  
  98. Pointer
  99. OrderedElemGetSuccessor(elem)
  100.     register OrderedElem    elem;
  101. {
  102.     elem = elem->next;
  103.     if (elem->next) {
  104.         return (OrderedElemGetBase(elem));
  105.     }
  106.     return (NULL);
  107. }
  108.  
  109. void
  110. OrderedElemPop(elem)
  111.     register OrderedElem    elem;
  112. {
  113.     elem->next->prev = elem->prev;
  114.     elem->prev->next = elem->next;
  115.     /* assignments used only for error detection */
  116.     elem->next = NULL;
  117.     elem->prev = NULL;
  118. }
  119.  
  120. void
  121. OrderedElemPushInto(elem, set)
  122.     OrderedElem    elem;
  123.     OrderedSet    set;
  124. {
  125.     OrderedElemInit(elem, set);
  126.     OrderedElemPush(elem);
  127. }
  128.  
  129. void
  130. OrderedElemPush(elem)
  131.     OrderedElem    elem;
  132. {
  133.     OrderedElemPushHead(elem);
  134. }
  135.  
  136. void
  137. OrderedElemPushHead(elem)
  138.     register OrderedElem    elem;
  139. {
  140.     elem->next = elem->set->head;
  141.     elem->prev = (OrderedElem)&elem->set->head;
  142.     elem->next->prev = elem;
  143.     elem->prev->next = elem;
  144. }
  145.  
  146. void
  147. OrderedElemPushTail(elem)
  148.     register OrderedElem    elem;
  149. {
  150.     elem->next = (OrderedElem)&elem->set->dummy;
  151.     elem->prev = elem->set->tail;
  152.     elem->next->prev = elem;
  153.     elem->prev->next = elem;
  154. }
  155.  
  156. void
  157. OrderedElemPushAfter(elem, oldElem)
  158.     register OrderedElem    elem;
  159.     register OrderedElem    oldElem;
  160. {
  161.     elem->next = oldElem->next;
  162.     elem->prev = oldElem;
  163.     oldElem->next = elem;
  164.     elem->next->prev = elem;
  165. }
  166.  
  167. void
  168. OrderedElemPushBefore(elem, oldElem)
  169.     register OrderedElem    elem;
  170.     register OrderedElem    oldElem;
  171. {
  172.     elem->next = oldElem;
  173.     elem->prev = oldElem->prev;
  174.     oldElem->prev = elem;
  175.     elem->prev->next = elem;
  176. }
  177.  
  178. Pointer
  179. OrderedSetPop(set)
  180.     OrderedSet    set;
  181. {
  182.     return (OrderedSetPopHead(set));
  183. }
  184.  
  185. Pointer
  186. OrderedSetPopHead(set)
  187.     register OrderedSet    set;
  188. {
  189.     register OrderedElem elem = set->head;
  190.  
  191.     if (elem != NULL && elem->next) {
  192.         OrderedElemPop(elem);
  193.         return (OrderedElemGetBase(elem));
  194.     }
  195.     return (NULL);
  196. }
  197.  
  198. Pointer
  199. OrderedSetPopTail(set)
  200.     register OrderedSet    set;
  201. {
  202.     register OrderedElem elem = set->tail;
  203.  
  204.     if (elem != NULL && elem->prev) {
  205.         OrderedElemPop(elem);
  206.         return (OrderedElemGetBase(elem));
  207.     }
  208.     return (NULL);
  209. }
  210.